#include "Test_ObserverPattern.h"

#include <QtTest/QtTest>

#include "ConcreteObserverExample.h"

void Test_ObserverPattern::test_storeSystem()
{
    ConcreteObservable observable;
    ConcreteObserver observer;

    /// Verificamos que se puedan agregar observadores.
    // Creamos una lista temporal con la cual comparar.
    std::list<Observer *> observerList;
    observerList.push_back(&observer);

    // Comparamos si las listas son iguales.
    observable.addObserver(&observer);
    QCOMPARE(observable.observers(), observerList);

    /// Verificamos que se puedan remover observadores.
    // Removes el observador previamente agregado.
    observable.removeObserver(&observer);
    QCOMPARE(observable.observers().empty(), true);

    /// Verificamos que no se puedan remover observadres
    /// que no se encuentran actualmente en la lista.
    // Creamos un observador temporal.
    ConcreteObserver observer2;

    // Agregamos el observador principal.
    observable.addObserver(&observer);

    // Tratamos de eliminar el observador temporal.
    observable.removeObserver(&observer2);

    // Verificamos que la lista no este vacia.
    QCOMPARE(observable.observers().empty(), false);
}

void Test_ObserverPattern::test_updateSystem()
{
    ConcreteObservable observable;
    ConcreteObserver observer;

    /// Verificamos que el observable notifique
    /// correctamente a sus observadores.
    // Agregamos un observador para testear.
    observable.addObserver(&observer);

    /// Verificamos que se actualizen las propiedades.
    // Cambiamos los valores del observable a verdadero.
    observable.setProp1(true);
    observable.setProp2(true);

    // Comparamos si los valores del observador
    // son igualmente verdaderos.
    QCOMPARE(observer.prop1(), std::string("true"));
    QCOMPARE(observer.prop2(), std::string("true"));

    // Cambiamos los valores del observable a falso.
    observable.setProp1(false);
    observable.setProp2(false);

    // Comparamos si los valores del observador
    // son igualmente falsos.
    QCOMPARE(observer.prop1(), std::string("false"));
    QCOMPARE(observer.prop2(), std::string("false"));
}
